package lanqiaobei2016;

public class _03搭积木 {
    /**
     * 搭积木
     * 小明最近喜欢搭数字积木，
     * 一共有10块积木，每个积木上有一个数字，0~9。
     * 搭积木规则：
     * 每个积木放到其它两个积木的上面，并且一定比下面的两个积木数字小。
     * 最后搭成4层的金字塔形，必须用完所有的积木。
     * 下面是两种合格的搭法：
     *    0
     *   1 2
     *  3 4 5
     * 6 7 8 9
     *
     *    0
     *   3 1
     *  7 5 2
     * 9 8 6 4
     * 请你计算这样的搭法一共有多少种？
     * 请填表示总数目的数字。
     * 注意：你提交的应该是一个整数，不要填写任何多余的内容或说明性文字。
     */
    static int ans = 0;
    public static void main(String[] args) {
        int[] a = new int[10];
        for (int i = 0 ; i< 10;i++){
            a[i] = i;
        }
        per(a,0);
        System.out.println(ans);
    }

    private static void per(int[] a, int k) {
        if (k == 10){
            ans++;
        }
        for (int i = k ; i < 10 ; i++){
            swap(a,k,i);

           if (k==1&&a[1]<a[0]||
                k==2&&a[2]<a[0]||
                k==3&&a[3]<a[1]||
                k==4&&(a[4]<a[1]||a[4]<a[2])||
                k==5&&a[5]<a[2]||
                k==6&&a[6]<a[3]||
                k==7&&(a[7]<a[3]||a[7]<a[4])||
                k==8&&(a[8]<a[4]||a[8]<a[5])||
                k==9&&a[9]<a[5]){
               swap(a,k,i);
               continue;
           }

            per(a, k +1);

            swap(a,k,i);
        }
    }

    private static void swap(int[] a, int k, int i) {
        int t = a[k];
        a[k] = a[i];
        a[i] = t;
    }
}
